<?php
/**
 Klasa zajmujaca się kopiowaniem plików na serwer i informowaniu klienta.
 Zawiera tez metody pokazujace drzewo katalogów i plikow począwszy od katalogu
 podaneto w konstruktorze (domyslnie 'dokumenty').
 .
 @file		class.dokumentyUpload.inc
 @author		Łukasz Marcińczak <lmarcinczak@euroland.pl>
 @version	$Revision: 1.0 $
 @date		5.11.2007

 */

class dokumentyUpload {

  public $maks_rozm_pliku=2097152;
  public $sciezka_zapisu;
  public static $tablicaTypow = array(
    'application/msword',
    'application/pdf',
    'image/jpeg',
    'image/gif',
    'application/excel',
    'application/mspowerpoint',
    'application/powerpoint',
    'application/vnd.ms-pps',
    'application/octet-stream bin',
    'application/octet-stream class',
    'application/octet-stream dms',
    'application/octet-stream exe',
    'application/octet-stream lha',
    'application/octet-stream lzh',
    'application/octet-stream',
    'application/octet-stream',
  );

  public $tablicaRoszerzen = array('pdf','doc','jpg','gif','xls','ppt','pps','zip','rar');
  public $akronim;
  public $sciServ = 'nic';
  public $nazwaArch;

  function __construct($zapis='', $docPath='', $akr='',$nazwaArch="dokumenty.zip"){

    $this->nazwaArch = $nazwaArch;

    if( trim( $docPath ) == '' ) {
      $docPath = Module::getModuleObj(Module_Candidates::MODULE_NAME)->getDocPath();
    }

    $zapis=($zapis=='')?('CV'):($zapis);
    $this->sciezka_zapisu .= $docPath.'/'.$zapis;

    if(!is_dir($this->sciezka_zapisu)){
      $sciezka = explode("/",$this->sciezka_zapisu);
      $tmpSc = "";

      foreach( $sciezka as $kat ){

        $tmpSc .= $kat;

        //tworz sciezke i zmieniaj prawa dopiero od miejsca, ktore nie istnieje
        //(zbudowana sciezka zawiera cala sciezke na serwerze!)
        if (file_exists($tmpSc) || is_dir($tmpSc)) {
          $tmpSc .= "/";
          continue;
        }

        mkdir( $tmpSc );
        chmod( $tmpSc,0777 );
        $tmpSc .= "/";
      }

    }

  }

  public function setMaks_rozm_pliku($rozm){

    if(is_numeric($rozm)&&$rozm>0){

      $this->maks_rozm_pliku = $rozm;
      return true;
    }
    else{
      return false;
    }

  }

  /**
   Funkcja zwracajaca zawarto�� katalogu podanego w argumencie, znajduj�
   cego si� w �cie�ce zapisu. Dane zwracane w formacie tablice wpis�w:
   "katalog"=> 0 / 1		- 1 oznacza katalog 0 plik
   "nazwa"=>	tekst		- nazwa danego pliku lub katalogu
   "rozmiar"=> liczba		- rozmiar , tylko w przypadku pliku, gdy katalog to -1
   "sciezka"=> tekst		- sciezka do pliku (od katalogu zapisu) lub katalogu przydatna do preparowania link�w
   */

  private function spakujZawartosc($sciezka){

    $zawart = scandir($sciezka);

    $listaPlk= array();
    $lista = array();

    if(count($zawart)>2){

      foreach($zawart as $wartosc){

        $tmp = explode(".",$wartosc);

        $roz = "";

        if(count($tmp)>1){
          $roz = $tmp[count($tmp)-1];
        }



        if($wartosc!="." && $wartosc!=".." && $wartosc!=$this->nazwaArch){

          $lista[]= $sciezka."/".$wartosc;

          if( in_array($roz,$this->tablicaRoszerzen) ){
            $listaPlk[]= $sciezka."/".$wartosc;
          }

        }

      }

    }

    lukasZIP::spakuj($listaPlk,$sciezka."/",$this->nazwaArch,true);
    lukasSystemPlikow::deltree($lista,array("r"),array());

  }

  public function pobierzZawartosc($kat='',$zip=0){

    $sciezka=$this->sciezka_zapisu;

    $tmp = array();

    if($kat!=''){
      $sciezka .= '/'.$kat;
    }


    if (!is_dir($sciezka)) {
      Log::logError(sprintf('pobierzZawartosc: sciezka do katalogu : %s nie istnieje', $sciezka));
      return array();
    }

    $zawartosc = array();

    if($zip==0){

      $zawartosc = scandir($sciezka,1);

    }else{

      $this->spakujZawartosc($sciezka);

      $czyZip = false;

      $zawartosc = scandir($sciezka,1);

      foreach($zawartosc as $wartosc){

        if($wartosc==$this->nazwaArch) {
          $czyZip = true;
        }

      }

      if($czyZip){

        try{

          $zawartosc = lukasZIP::pobierzDane($sciezka,$this->nazwaArch,false);

        }catch(Exception $e){

          $zawartosc = array();
        }

      }
      else{
        $zip=0;
      }
    }

    $tablica = array();

    foreach($zawartosc as $klucz => $wartosc){

      if($wartosc=='.' || $wartosc=='..' || $wartosc==$this->nazwaArch){
        unset($zawartosc[$klucz]);
      }

    }

    if( sizeof($zawartosc) < 1){
      return array();
    }
    else{

      foreach($zawartosc as $klucz => $wartosc){

        if($zip==0){

          $tmp['nazwa']=$zawartosc[$klucz];

          if(is_dir($sciezka.'/'.$zawartosc[$klucz])){
            $tmp['katalog']=1;
            $tmp['rozmiar']=-1;
            $nowaSciezka = $sciezka.'/'.$zawartosc[$klucz];
            $tmp['sciezka']=$nowaSciezka;

          }else if(is_file($sciezka.'/'.$zawartosc[$klucz])){
            $tmp['katalog']=0;
            $tmp['rozmiar']=filesize($sciezka.'/'.$zawartosc[$klucz]);

            $nowaSciezka = str_replace('var/www/html/','',$sciezka.'/'.$zawartosc[$klucz]);
            //$nowaSciezka = $sciezka.'/'.$zawartosc[$i];
            $tmp['sciezka']=$nowaSciezka;
          }

        }else{
          $tmp['nazwa'] = $zawartosc[$klucz]["nazwa"];
          $tmp['katalog'] = $zawartosc[$klucz]["czyKatalog"];
          $tmp['rozmiar'] = ($zawartosc[$klucz]["czyKatalog"]==0)?(-1):($zawartosc[$klucz]["rozmiarRzeczywisty"]);
          $tmp['sciezka'] = str_replace('var/www/html/','',$sciezka."/".$this->nazwaArch);

        }

        $tmp['zip'] = $zip;

        $tablica[]=$tmp;
      }

      return $tablica;
    }

  }

  public function pokazZawartosc($kat='',$upr,$zip=1){

    $zawart = $this->pobierzZawartosc($kat,$zip);

    $html = '';

    if(!is_array($zawart)) {
      $html = $zawart;
    }
    else{

      $zip = $zawart[0]['zip'];		//	- podmiana wartości zip je�eli w katalogu nie ma pliku zip

      if($zip==1){
        $_SESSION["daneDokumentow"] =  $zawart;
      }

      $html .= '<table>';

      foreach($zawart as $wart){
        $html .= '<tr>';
        if($wart['katalog']==1){

          //$html .='<td><img src="rejestracja_online/folder.png" alt="">'.$wart['nazwa'].'</td>';

        }else{

          $nazw_pliku = explode('.',$wart['nazwa']);
          $obrazek = 'compfile.png';
          $nazwa = $wart['nazwa'];

          if(is_file('rejestracja_online/'.$nazw_pliku[count($nazw_pliku)-1].'.png')){
            $obrazek = $nazw_pliku[count($nazw_pliku)-1].'.png';
          }

          if($upr==1){

            if($zip==0) {
              $html .='<td><img src="rejestracja_online/'.$obrazek.'" alt=""><a href="'.(str_replace('/chroot/apache/','',$wart['sciezka'])).'">'.$nazwa.'</a></td>';
            }
            else{
              $html .='<td><img src="rejestracja_online/'.$obrazek.'" alt=""><a href="?p=admin&amp;s=rejestracja_online&amp;o=pobierz_dok&amp;z='.$nazwa.'">'.$nazwa.'</a></td>';
            }

          }
          else{
            $html .='<td><img src="rejestracja_online/'.$obrazek.'" alt="">'.$nazwa.'</td>';
          }
        }

        $html .= '</tr>';
      }

      $html .= '</table><br>';

    }

    return $html;

  }

  public function pokazUpload($nazwa_wniosku,$zip=0,$inputCount=1,$addInput=false,$showTypes=true){

    /**
     *	PAMIETAC O ZMIENNEJ GLOBALNEJ 'window.dok' W 'formularze.js'
     */

    $html = '<script language="JavaScript" type="text/javascript">';
    $html .= 'function pokazUpl(){'."\n";

    $html .= 'window.dok = window.dok+1;'."\n";

    $html .= 'var znacznik = document.createElement(\'input\');'."\n";
    $html .= 'znacznik.setAttribute(\'type\', \'file\');'."\n";
    $html .= 'znacznik.setAttribute(\'name\', \'dok\'+window.dok);'."\n";
    $html .= 'znacznik.setAttribute(\'id\', \'id_dok\'+window.dok);'."\n";
    $html .= 'znacznik.setAttribute(\'style\',\'display:block;\');'."\n";
    $html .= 'var kontener = document.getElementById(\'wniosek\');'."\n";
    $html .= 'kontener.appendChild(znacznik);'."\n";

    $html .= '}'."\n";
    $html .= '</script>';
    $html .= '<div id="upload_div_id" class="upload_div">';
    $html .= '<input type="hidden" name="nazwa_wniosku" value="'.$nazwa_wniosku.'">';
    $html .= '<div id="wniosek" style="display:block;">';
    $html .= '<input type="hidden" name="MAX_FILE_SIZE" value="'.$this->maks_rozm_pliku.'"  >'."\n";

    for($i=1;$i<$inputCount+1;$i++){

      if($showTypes) $html .= '<div class="add_file_elem_left">Typ: '.CandidatesViewManager::candidatesFileTypesSelect( "dok_type".$i ).'</div>';
      $html .= '<div class="add_file_elemt"><input id="id_dok'.$i.'" name="dok'.$i.'" class="upload_div" type="file"></div><br/>'."\n";
    }

    $html .= '</div><br>';

    if( $addInput ) {
      $html .= '<a href="#self" onclick="javascript:pokazUpl()"> Dodaj kolejny </a><br>';
    }

    $html .= '<div class="add_file_elemt">Plik może mieć'."\n";
    $html .= 'maksymalnie <b>'.($this->maks_rozm_pliku/1024).' kB</b> i być w jednym z '."\n";
    $html .='nastąpujących formatów: ';

    foreach($this->tablicaRoszerzen as $klucz => $wartosc) {

      if($klucz != 0) {
        $html .= ', ';
      }

      $html .='<b>'.$wartosc.'</b>';
    }

    $html .= '.</h3>';

    $html .= '</div>';
    $html .= '</div>';

    return $html;
  }

  public function przerobFiles($zip = 0) {
    $bledy = array();
    $bledy[] = array('OK','Wszystkie pliki dodano.');
   if(isset($_FILES) && count($_FILES) != 0) {
      $i=1;
	 
      foreach($_FILES as $klucz => $wartosc) {

        if(substr($klucz,0,3) == 'dok'){

          $plik_tmp = $wartosc['tmp_name'];
          $plik_nazwa = $wartosc['name'];
          $plik_rozmiar = $wartosc['size'];
          $plik_typ = $wartosc['type'];

          if($wartosc['error'] == 0){

            $rozszerzenie = strtolower(substr( $plik_nazwa, strrpos( $plik_nazwa, "." ) + 1));
            //SPOSÓB WALIDACJI WG METADANYCH PLIKU WYLACZONY
            //ZE WZGLEDU NA BLEDNIE ZAPISYWANE TYPY W PLIKACH LUB WOGOLE NIEOBECNE
            //            if(!in_array($plik_typ, self::$tablicaTypow)){
            //              $bledy[] = array($plik_nazwa,'Niepoprawny format ['.$plik_typ.'] pliku.');
            //            }else if( strpos($plik_typ,"application/octet-stream")!== false && !in_array( $rozszerzenie, $this->tablicaRoszerzen ) ){
            //              $bledy[] = array($plik_nazwa,'Niepoprawny format ['.$plik_typ.'] pliku.');
            //            }
            if( !in_array( $rozszerzenie,$this->tablicaRoszerzen ) ){
              $bledy[] = array($plik_nazwa,'Niepoprawne rozszerzenie ['.$rozszerzenie.'] pliku.');
            }
            else{
              if(isset($_POST[ "dok_type".$i ]) && $_POST['cand_surname']){
              	//$plik_nazwa = Application::getDocumentTypeNameByID( (isset($_POST[ "dok_type".$i ]) ? $_POST[ "dok_type".$i ]:"CV") )."_".(isset($_POST['cand_surname'])?trim($_POST['cand_surname']):(isset($staff['lastName'])?trim($staff['lastName']):"file")).".".$rozszerzenie;              	
				$dokTypeName = Document_Type::getNameById($_POST[ "dok_type".$i ]);
				$plik_nazwa = (!empty($dokTypeName) ? $dokTypeName:"CV")."_".(isset($_POST['cand_surname'])?trim($_POST['cand_surname']):(isset($staff['lastName'])?trim($staff['lastName']):"file")).".".$rozszerzenie;              	
              }else{
              	$plik_nazwa = strip_tags($plik_nazwa);
              }
              $plik_nazwa = Application::polNaEngZnaki( $plik_nazwa );
              $typeSciezka = $this->sciezka_zapisu.( $_POST[ "dok_type".$i ]!= "" ? "/".$dokTypeName : "" );

              if( !is_dir($typeSciezka ) ){
                mkdir( $typeSciezka );
                chmod( $typeSciezka, 0777);
              }

              move_uploaded_file($plik_tmp, $typeSciezka.'/'.$plik_nazwa);
              chmod( $typeSciezka.'/'.$plik_nazwa, 0777 );

			  if(!is_file($typeSciezka.'/'.$plik_nazwa))
			  {
				$bledy[] = array($plik_nazwa,'Błąd zapisu pliku w ścieżce: '.$typeSciezka.'/'.$plik_nazwa);
			  }
			  
              if($zip==1){
                lukasZIP::spakuj(array($typeSciezka.'/'.$plik_nazwa), $typeSciezka.'/', $this->nazwaArch, true);
                @unlink($typeSciezka.'/'.$plik_nazwa);
              }
            }
          }else{

            switch($wartosc['error']) {
              case 1 : $bledy[]=array($plik_nazwa,'Za duży rozmiar pliku.');
              break;
              case 2 : $bledy[]=array($plik_nazwa,'Za duży rozmiar pliku.');
              break;
              case 3 : $bledy[]=array($plik_nazwa,'Plik został tylko częciowo przegrany.');
              break;
              case 6 : $bledy[]=array($plik_nazwa,'Brak folderu tymczasowego.');
              break;
              case 7 : $bledy[]=array($plik_nazwa,'Błąd podczas zapisu pliku na dysku.');
              break;
              case 8 : $bledy[]=array($plik_nazwa,'Kopiowanie zatrzymane..');
              break;
            }
          }
        }

        $i++;
      }

    }
    else{
      $bledy[] = array('Brak','Brak Tablicy Files.');
    }

    return $bledy;
  }

  public function czyJestKatalog($kat){

    $dir = $this->sciezka_zapisu.'/'.$kat;

    if(is_dir($dir) && is_array($this->pobierzZawartosc($kat))){
      return true;
    }

    return false;
  }


  public function pokazFormPrzen($wniosek){

    $wniosek = str_replace('archiwum/','',$wniosek);
    $tresc = '<form name="przenDok" action="" method="POST" enctype="multipart/form-data">'."\n";
    $tresc .= '<input type="hidden" name="op" value="przeniesDokumenty">';
    $tresc .= '<input name="nazwa_wniosku" type="hidden" value="'.$wniosek.'">'."\n";
    $tresc .='<input name="akr_kli" type="text">'."\n";
    $tresc .='<input type="submit" value="Przenieś"></form>';

    return $tresc;
  }

  public function kopiujDokumenty($wniosek,$zip=0){

    $this->sciServ;
    $zrodlo= $this->sciServ.'rejestracja_online/dokumenty/'.$wniosek;
    $zawartosc = scandir($zrodlo,1);
    $odpowiedz = 'OK';

    if($this->czyJestKlient($this->akronim)) {

      if($this-> wpiszDokumWniosek($wniosek)) {
        $odpowiedz = 'OK';
      }
      else{
        $odpowiedz = '<br><br><center><h2>Nie wpisano do bazy.</h2></center>';
      }

      if($zip == 0) {

        if(sizeof($zawartosc) < 3) {
          $odpowiedz =  '<br><br><center><h2>Brak dokumentów.</h2></center>';
        }
        else {

          for($i=0; $i<sizeof($zawartosc)-2; $i++){

            try{
              copy($zrodlo.'/'.$zawartosc[$i],$this->sciezka_zapisu.'/'.$zawartosc[$i]);
              chmod($this->sciezka_zapisu.'/'.$zawartosc[$i],0777);
            }
            catch(Exception $e){
              $odpowiedz = '<br><br><center><h2>Nie skopiowano któregoś pliku</h2></center>';
            }
          }
        }
      }
      else{

        if(is_file($zrodlo."/".$this->nazwaArch) ) {
          copy($zrodlo.'/'.$this->nazwaArch,$this->sciezka_zapisu.'/'.$this->nazwaArch);
          chmod($this->sciezka_zapisu.'/'.$this->nazwaArch,0777);
        }else{
          $odpowiedz =  '<br><br><center><h2>Brak dokumentów.</h2></center>';
        }
      }
    }
    else{
      $odpowiedz = '<br><br><center><h2>Nie ma takiego klienta.</h2></center>';
    }

    return $odpowiedz;
  }

  public function skasujKatalog($wniosek){
    if($wniosek!='') {
      $dir = $this->sciezka_zapisu.'/'.$wniosek;
    }
    else{
      $dir = $this->sciezka_zapisu;
    }

    Application::deltree(array($dir), array("r"), array());
  }
}
